#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include "blockQueue.hpp"
#include "task.hpp"
// 生产者的生产方式
void *Productor(void *args)
{
    //BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    //生产任务
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
    char ope[] = "+-*/%";
    while (true)
    {
        //sleep(1);
        // 1.通过某种渠道获取任务
        // int data = rand() % 10 + 1;
        int x = rand()%20 + 1;
        int y = rand()%10;
        char op = ope[rand()%5];
        // 2.将推送任务到BlockQueue中-->完成生产
        Task t(x,y,op);
        bq->push(t);  
        //std::cout << "productor data:" << data << std::endl;
        std::cout <<pthread_self()<<"|productor data:" << t.formatArg()<<"?"<< std::endl;
    }
}

// 消费者的生产方式
void *Consumer(void *args)
{
    //BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    //处理任务
    BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(args);
    while (true)
    {
        // sleep(1);
        // 1.将任务从BlockQueue中获取
        //int data;
         Task t;
         bq->pop(&t);
        // 2.结合某种业务逻辑，处理任务
         t();
        std::cout <<pthread_self()<<"|consumer data:" <<t.formatArg()<<t.formatRes()<< std::endl;
    }
}

int main()
{
    // 设置随机数种子
    srand(time(nullptr) ^ getpid());
    // 交易场所
    //BlockQueue<int> bq;
    BlockQueue<Task>* bq =  new BlockQueue<Task>;
    // 创建生产者线程和消费者线程
    pthread_t p[2], c[3];
    pthread_create(&p[0], nullptr, Productor, bq);
    pthread_create(&p[1], nullptr, Productor, bq);
    pthread_create(&c[0], nullptr, Consumer,  bq);
    pthread_create(&c[1], nullptr, Consumer,  bq);
    pthread_create(&c[2], nullptr, Consumer,  bq);

    // 线程等待
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(c[2], nullptr);
    return 0;
}